#include <iostream>
#include <functional>
#include <algorithm>
#include <map>
using namespace std;

map<string,int(*)(int,int)> string_function;
map<string,function<int(int,int)> > string_function_2_edition;
int max_value(const int& ,const int&);
//we can use funciton<T> type to redefinte the map
string_function_2_edition = {
	{"max",max_value},
	{"add",[](const int& x,const int& y){return x+y;}},
	{"-",std::minus<int>(`)}
}
int max_value(const int & lhs , const int &rhs){
	if(lhs > rhs)
		return lhs;
	else
		return rhs;
}
string_function.insert({"max_value",max_value});
auto mod = [](const int &lhs,const int &rhs) -> int{
	return max(lhs,rhs);
};
string_function.insert({"%",mod}); //ERROR! {*,*} is a pair , 
//the reason that this sentence was errored is type
//lambda exporession has its own type , cannot be mapped to 
//int(cosnt int ,const int) , it's can't happend
class SmallInt
{
public:
	SmallInt(int i = 0):val(i){
		;
	}
	explicit operator int() const{ return val;}

private:
	using std::size_t size_t;
	size_t val;

};
// implicit
SmallInt i = 3;
i + 4;
//explicit
SmallInt tmp;
int ans = `+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++static_cast<int>(tmp) + 12;

int main(int argc, char const *argv[])
{
	
	return 0;
}